﻿using System;
using System.Collections.Generic;
using System.Linq;
using OcenyOpisowe.Client.Data;

namespace OcenyOpisowe.Client.Controls
{
	/// <summary>
	/// Kontrolka pozwalająca na bindowanie do zewnętrznych danych.
	/// Sposób pobierania danych jest określony przez odpowiednie źródło danych.
	/// </summary>
	public abstract class DataBoundControl : AbstractControl
	{
		#region Prywatne zmienne klasy
		/// <summary>
		/// Źródło danych z którego kontrolka bedzie brała swoje dane.
		/// </summary>
		private IDataSource _dataSource;
		#endregion

		#region Publiczne właściwości klasy
		/// <summary>
		/// Źródło danych z którego kontrolka bedzie brała swoje dane.
		/// </summary>
		public IDataSource DataSource
		{
			get { return _dataSource; }
			set { _dataSource = value; }
		}
		#endregion

		#region Konstruktor klasy
		/// <summary>
		/// Inicjuje instancję kontrolki.
		/// </summary>
		protected DataBoundControl()
		{
		}
		#endregion

		#region Metoda DataBind
		/// <summary>
		/// Binduje dane do określonego źródła danych.
		/// </summary>
		public void DataBind()
		{
			if(_dataSource == null)
			{
				Application.Instance.Console.ReportError("Control DataSource is null!");
				return;
			}
			OnDataBinding();
		}
		#endregion

		#region Metoda OnDataBinding
		/// <summary>
		/// Metoda zawierająca implementację bindowania danych do danej kontrolki.
		/// </summary>
		/// <remarks>
		/// Implementacja bindowania danych jest różna dla różnych kontrolek... więc cóż - metoda abstrakcyjna.
		/// </remarks>
		protected abstract void OnDataBinding();
		#endregion

		#region Metoda SetDataSource
		/// <summary>
		/// Ustawia źródło danych na źródło podane w argumencie metody.
		/// Wykorzystywane głównie przez zewnętrzny kod javascript.
		/// </summary>
		/// <param name="dataSource">Źródło danych, które przypisać do tej kontrolki.</param>
		public void SetDataSource(IDataSource dataSource)
		{
			_dataSource = dataSource;
		}
		#endregion
	}
}
